ホームに戻る
出典 :
ListObject オブジェクト (Excel) | Microsoft Learn ListObjects オブジェクト (Excel) | Microsoft Learn ListRow オブジェクト (Excel) | Microsoft Learn ListRows オブジェクト (Excel) | Microsoft Learn テーブル操作の概要(ListObject)|VBA入門 テーブル操作のVBAコード(ListObject,DataBodyRange)|VBA入門
関連 :
テーブル
目次 :

※この記事は書きかけです。

VBAからテーブルを操作する

テーブルはVBAと相性が良く、セル範囲をテーブル化することでセルの絶対位置(アドレス)を考慮せずにデータの操作が可能となる。
テーブルの操作は ListObject を介して行う。
尚、テーブルについてはリンク先を参照のこと。

ListObject と ListObjects

ひとつのテーブルはひとつの ListObject に紐づけられる。
ひとつのワークシートには複数のテーブルを作成することができ、ワークシートに存在するテーブル( ListObject )を束ねたコレクションが ListObjects である。
Sub DoSomething() ' テーブル範囲を格納する tbl 変数の宣言 Dim tbl As ListObject ' アクティヴなシートの「テーブル1」を tbl に格納 Set tbl = ActiveSheet.ListObjects("テーブル1") : End Sub
ListObjects はシート( WorkSheet )のプロパティであり、テーブル名を指定することで特定のテーブルに紐づく ListObject が取得できる。

テーブルの作成

' テーブルの初期化 Private Sub InitializeTable() ' 見出し行を作成 Cells(ROW_HEADER, E_Col.Folder).Value = "フォルダ" Cells(ROW_HEADER, E_Col.Filename).Value = "ファイル名" Cells(ROW_HEADER, E_Col.Schema).Value = "スキーマ" Cells(ROW_HEADER, E_Col.Name_P).Value = "物理名称" Cells(ROW_HEADER, E_Col.Name_L).Value = "論理名称" Cells(ROW_HEADER, E_Col.ObjCode).Value = "オブジェクトコード" Cells(ROW_HEADER, E_Col.Attr).Value = "属性" ' テーブルを作成 Dim ddTable As ListObject Set ddTable = ListObjects.Add(SourceType:=xlSrcRange, _ Source:=Range(Cells(ROW_HEADER, E_Col.Folder).Address).CurrentRegion, _ XlListObjectHasHeaders:=xlYes) ' テーブル名、テーブルスタイルを設定 ddTable.Name = "目録" ddTable.TableStyle = "TableStyleLight2" End Sub
上記は、テーブルを新規作成する例である。
プロシージャ InitializeTable() はワークシートのメンバとして定義されており、ListObjects は「自身(シート)の ListObjects 」を指す。

ここでは、まず見出し行を作成し、作成した見出し行をテーブルに変換している。
ListObjects.Add() はワークシートにテーブルを追加するメソッドで、ここでは以下のパラメータを指定している。
SourceType
元データの種類
xlSrcRange
セル範囲
Source
元データ
Range(Cells(ROW_HEADER, E_Col.Folder).Address).CurrentRegion
Cells(ROW_HEADER, E_Col.Folder) が含まれる範囲
XlListObjectHasHeaders
見出し行を作成するか
xlYes
はい
テーブル名は Add() のパラメータには含まれないため、作成後に付与する。

テーブルのセルを参照・更新

Sub DoSomething() ' テーブル「目録」を tbl に関連付ける Dim tbl As ListObject Set tbl = ListObjects("目録") ' 列「列1」の 6 行目に「い」を格納 tbl.ListColumns("列1").Range(6) = "い" ' 列「列2」の 5 行目の値を取得 Dim val val = tbl.ListColumns("列2").Range(5) End Sub

テーブルの破棄

Sub DoSomething() ' 既存のテーブルを全て削除 Dim lob As ListObject For Each lob In ListObjects lob.Delete Next End Sub

理想的な構成

テーブル(およびワークシート)を使用する際は、以下を原則とすることで効率よくデータを管理することができる。
(特にVBAとの連携時)